/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estsapp.clasesPrueba;

import estsapp.entidades.CategoriaTrabajador;
import estsapp.entidades.CentroTrabajo;
import estsapp.entidades.DetalleOrden;
import estsapp.entidades.EstadoOrdenDeProduccion;
import estsapp.entidades.EstadoPedidoAProveedores;
import estsapp.entidades.EstadoReservaMateriales;
import estsapp.entidades.Maquinaria;
import estsapp.entidades.ModeloGestionStock;
import estsapp.entidades.OrdenDeProduccion;
import estsapp.entidades.OrdenDeProduccionEstado;
import estsapp.entidades.ProductoTerminado;
import estsapp.expertos.ExpertoCodigoBrisch;
import estsapp.expertos.FabricaExpertos;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import persistencia.Conexion;
import persistencia.Fachada;
import persistencia.exceptions.ExcepcionFachada;

/**
 * Clase usada para realizar Distintas Pruebas
 * @see crearCentroTrabajo(Centro nombreCentro)
 * @author diego
 */
public class Prueba {

    /**
     * crea un centro de trabajo con el nombre ingresado
     *
     * @param nombreCentro
     */
    public static void crearCentroTrabajo(String nombreCentro) {

        CentroTrabajo centro = new CentroTrabajo();
        ExpertoCodigoBrisch codigos = (ExpertoCodigoBrisch) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.GENERAR_CODIGO);
        centro.setCodigo(codigos.generarCodigo(centro));
        centro.setNombre(nombreCentro);
        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(centro);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            System.out.println("ERROR al crear centro de trabajo");
            Conexion.getInstancia().deshacerTx();
            System.exit(0);
        }
        System.out.println("Centro de Trabajo: "+nombreCentro+" creado.");

    }
    
    /**
     * crea una categoria de trabajador con el nombre ingresado
     * @param nombreCategoria
     * @param codigo
     * @param remuneracio 
     */
    public static void crearCategoriaTrabajador(String nombreCategoria, String codigo, Float remuneracio) {
        
        CategoriaTrabajador categoria = new CategoriaTrabajador();
        categoria.setCodigo(codigo);
        categoria.setNombre(nombreCategoria);
        categoria.setRemuneracion(remuneracio);

        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(categoria);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            System.out.println("ERROR al crear categoria de trabajador");
            Conexion.getInstancia().deshacerTx();
            System.exit(0);
        }
        System.out.println("Categoria: "+nombreCategoria+" creada.");

    }
    
    public static void crearEstadoReservaMateriales (String nombreEstado, String descripcion) {
        
        EstadoReservaMateriales estado = new EstadoReservaMateriales();
        estado.setDescripcion(descripcion);
        estado.setNombre(nombreEstado);
        

        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(estado);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            System.out.println("ERROR al crear estado reserva materiales");
            Conexion.getInstancia().deshacerTx();
            System.exit(0);
        }
        System.out.println("Categoria: "+nombreEstado+" creada.");

    }
    
    public static void crearModeloGestionStock(String nombreModelo, String descripcion) {
        
        ModeloGestionStock modelo = new ModeloGestionStock();
        modelo.setNombre(nombreModelo);
        modelo.setDescripcion(descripcion);
        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(modelo);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            System.out.println("ERROR al crear modelo");
            Conexion.getInstancia().deshacerTx();
            System.exit(0);
        }
        System.out.println("Modelo Gestion Stock: "+nombreModelo+" creado.");

    }
    
    public static void crearMaquinaria(String nombreMaquinaria, Float consumo, String unidadConsumo) {
        
        Maquinaria maquinaria = new Maquinaria();
        
        maquinaria.setNombre(nombreMaquinaria);
        maquinaria.setConsumo(consumo);
        maquinaria.setUnidadConsumo(unidadConsumo);
        maquinaria.setVigente(true);
        maquinaria.setCodigo(new ExpertoCodigoBrisch().generarCodigo(maquinaria));

        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(maquinaria);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            System.out.println("ERROR al crear maquinaria");
            Conexion.getInstancia().deshacerTx();
            System.exit(0);
        }
        System.out.println("Maquinaria: "+nombreMaquinaria+" creada - Codigo:"+maquinaria.getCodigo()+".");

    }
    
        public static void crearEstadoOrdenDeProduccion (String nombreEstado, String descripcion) {
        
        EstadoOrdenDeProduccion estado = new EstadoOrdenDeProduccion();
        estado.setDescripcion(descripcion);
        estado.setEstado(nombreEstado);
        

        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(estado);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            System.out.println("ERROR al crear estado orden");
            Conexion.getInstancia().deshacerTx();
            System.exit(0);
        }
        System.out.println("Categoria: "+nombreEstado+" creada.");

    } 
        public static void crearEstadoPedidoAProveedores(String nombreEstado, String descripcion) {
        
        EstadoPedidoAProveedores estado = new EstadoPedidoAProveedores();
        estado.setDescripcion(descripcion);
        estado.setNombre(nombreEstado);
        

        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(estado);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            System.out.println("ERROR al crear estado pedido a prov");
            Conexion.getInstancia().deshacerTx();
            
        }
        System.out.println("Categoria: "+nombreEstado+" creada.");

    } 
        
        public static void crearOrdenesProduccionEnProduccion(){
            Criteria critProd = Fachada.getInstancia().crearCriterio(ProductoTerminado.class);
            List prod = Fachada.getInstancia().buscar(ProductoTerminado.class, critProd);
            
            Criteria critEstado = Fachada.getInstancia().crearCriterio(EstadoOrdenDeProduccion.class);
            critEstado.add(Restrictions.eq("estado", "En produccion").ignoreCase());
            List listEstados = Fachada.getInstancia().buscar(EstadoOrdenDeProduccion.class, critEstado);
            EstadoOrdenDeProduccion estado = (EstadoOrdenDeProduccion)listEstados.get(0);
            List<OrdenDeProduccionEstado> listaEstados= new ArrayList<>();
            
            OrdenDeProduccionEstado ordenEst = new OrdenDeProduccionEstado();
            ordenEst.setEstado(estado);
            ordenEst.setEstadoActual(true);
            ordenEst.setFecha(new Date());
            
            listaEstados.add(ordenEst);

            
            DetalleOrden nuevoDet = new DetalleOrden();
            nuevoDet.setCantidad(10l);
            nuevoDet.setProductoTerminado((ProductoTerminado)prod.get(0));
            
            OrdenDeProduccion orden = new OrdenDeProduccion();
            orden.setFechaDeOrden(new Date());
            orden.setListaDetalles(nuevoDet);
            orden.setEstados(listaEstados);
            
            
        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(orden);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            ex.printStackTrace();
        }
        }
        public static void crearOrdenesProduccionEnEspera(){
            Criteria critProd = Fachada.getInstancia().crearCriterio(ProductoTerminado.class);
            List prod = Fachada.getInstancia().buscar(ProductoTerminado.class, critProd);
            
            Criteria critEstado = Fachada.getInstancia().crearCriterio(EstadoOrdenDeProduccion.class);
            critEstado.add(Restrictions.eq("estado", "En espera").ignoreCase());
            List listEstados = Fachada.getInstancia().buscar(EstadoOrdenDeProduccion.class, critEstado);
            EstadoOrdenDeProduccion estado = (EstadoOrdenDeProduccion)listEstados.get(0);
            List<OrdenDeProduccionEstado> listaEstados= new ArrayList<>();
            
            OrdenDeProduccionEstado ordenEst = new OrdenDeProduccionEstado();
            ordenEst.setEstado(estado);
            ordenEst.setEstadoActual(true);
            ordenEst.setFecha(new Date());
            
            listaEstados.add(ordenEst);

            
            DetalleOrden nuevoDet = new DetalleOrden();
            nuevoDet.setCantidad(10l);
            nuevoDet.setProductoTerminado((ProductoTerminado)prod.get(0));
            
            OrdenDeProduccion orden = new OrdenDeProduccion();
            orden.setFechaDeOrden(new Date());
            orden.setListaDetalles(nuevoDet);
            orden.setEstados(listaEstados);
            
            
            
        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(orden);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            ex.printStackTrace();
        }
            
        }
        public static void crearOrdenesProduccionEntrgada(){
            Criteria critProd = Fachada.getInstancia().crearCriterio(ProductoTerminado.class);
            List prod = Fachada.getInstancia().buscar(ProductoTerminado.class, critProd);
            
            Criteria critEstado = Fachada.getInstancia().crearCriterio(EstadoOrdenDeProduccion.class);
            critEstado.add(Restrictions.eq("estado", "Entregada").ignoreCase());
            List listEstados = Fachada.getInstancia().buscar(EstadoOrdenDeProduccion.class, critEstado);
            EstadoOrdenDeProduccion estado = (EstadoOrdenDeProduccion)listEstados.get(0);
            List<OrdenDeProduccionEstado> listaEstados= new ArrayList<>();
            
            OrdenDeProduccionEstado ordenEst = new OrdenDeProduccionEstado();
            ordenEst.setEstado(estado);
            ordenEst.setEstadoActual(true);
            ordenEst.setFecha(new Date());
            
            listaEstados.add(ordenEst);

            
            DetalleOrden nuevoDet = new DetalleOrden();
            nuevoDet.setCantidad(10l);
            nuevoDet.setProductoTerminado((ProductoTerminado)prod.get(0));
            
            OrdenDeProduccion orden = new OrdenDeProduccion();
            orden.setFechaDeOrden(new Date());
            orden.setListaDetalles(nuevoDet);
            orden.setEstados(listaEstados);
            
            
        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(orden);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            ex.printStackTrace();
        }
        }
    
    
}
